﻿using System;
using System.Collections.Generic;
using System.Linq;
using Zero.Core.Domain;
using Zero.Core.Domain.Query;
using Zero.POCO.Compagne;
using Zero.POCO.Donnees;
using Zero.POCO.Enum;
using Zero.POCO.Enum.Helper.Support;
using Zero.POCO.Helper.Support;
using Zero.POCO.Support;

namespace Zero.Presenter.Donnees
{
    public class TarifsPresenter : ITarifsPresenter
    {
        private ITarifView _tarifView;
        private IRepository<TarifTv, Guid> _tarifTvRepository;
        private IRepository<TarifRd, Guid> _tarifRdRepository;
        private IRepository<TarifPr, Guid> _tarifPrRepository;
        private IReadOnlyRepository<SupportTV, int> _repositoryTV;
        private IReadOnlyRepository<SupportPresse, int> _repositPresse;
        private IReadOnlyRepository<SupportRadio, int> _repositoryRadio;
        public TarifsPresenter(ITarifView tarifView, IRepository<TarifTv, Guid> tarifTvRepository, IRepository<TarifRd, Guid> tarifRdRepository, IRepository<TarifPr, Guid> tarifPrRepository, IReadOnlyRepository<SupportTV, int> repositoryTV, IReadOnlyRepository<SupportRadio, int> repositoryRadio, IReadOnlyRepository<SupportPresse, int> repositoryPresse)
        {
            _tarifView = tarifView;
            _tarifPrRepository = tarifPrRepository;
            _tarifRdRepository = tarifRdRepository;
            _tarifTvRepository = tarifTvRepository;
            _repositPresse = repositoryPresse;
            _repositoryRadio = repositoryRadio;
            _repositoryTV = repositoryTV;
        }
        public void Display()
        {



            _tarifView.SupportPresses = _repositPresse.FindAll().ToList();
            _tarifView.SupportTvs = _repositoryTV.FindAll().ToList();
            _tarifView.SupportRadios = _repositoryRadio.FindAll().ToList();







             //_tarifView.tarifs
            var tarifpr = _tarifPrRepository.FindAll();
            var tarifrd = _tarifRdRepository.FindAll();
            var tariftv = _tarifTvRepository.FindAll();

            var tarifView=new List<TarifView>();
            /************************mapper presse ********************************/
            foreach (var tarifPr in tarifpr)
            {
                var temp = new TarifView()
                {
                    Nom = tarifPr.nom,
                    Remarque = tarifPr.autre,
                    annee = tarifPr.annee,
                    media = TypeMedia.PR,
                    mois = tarifPr.Mois,
                    id = tarifPr.id
                };
                foreach (var pr in tarifPr.LignesTarifPrs)
                {
                    var lignetarifTemp = new LignesTarif()
                    {
                        Debut = new TimeSpan(0,0,0),
                        Fin = new TimeSpan(23, 59, 59),
                        Format = pr.Format,
                        Prix = pr.Prix,
                        id = pr.id,
                        JourSemaine = pr.JourSemaine
                    };
                    if (temp.lignetarif == null) temp.lignetarif = new List<LignesTarif>();temp.lignetarif.Add(lignetarifTemp);
                }
                tarifView.Add(temp);
            }


            /************************mapper radion ********************************/
            foreach (var tarifRd in tarifrd)
            {
                var temp = new TarifView()
                {
                    Nom = tarifRd.nom,
                    Remarque = tarifRd.autre,
                    annee = tarifRd.annee,
                    media = TypeMedia.RD,
                    mois = tarifRd.Mois,
                    id = tarifRd.id

                };
                foreach (var rd in tarifRd.LignesTarifRds)
                {
                    var lignetarifTemp = new LignesTarif()
                    {
                        Debut = rd.Debut,
                        Fin = rd.Fin,
                        Format = rd.duree,
                        Prix = rd.Prix,
                        id = rd.id,
                        JourSemaine = rd.JourSemaine
                    };
                    if (temp.lignetarif == null) temp.lignetarif = new List<LignesTarif>();
                    temp.lignetarif.Add(lignetarifTemp);
                }
                tarifView.Add(temp);
            }
            /************************mapper tele ********************************/
            foreach (var tarifTv in tariftv)
            {
                var temp = new TarifView()
                {
                    Nom = tarifTv.nom,
                    Remarque = tarifTv.autre,
                    annee = tarifTv.annee,
                    media = TypeMedia.TV,
                    mois = tarifTv.Mois,
                    id = tarifTv.id

                };
                foreach (var tv in tarifTv.LignesTarifTvs)
                {
                    var lignetarifTemp = new LignesTarif()
                    {
                        Debut = tv.Debut,
                        Fin = tv.Fin,
                        Format = tv.duree,
                        Prix = tv.Prix,
                        id = tv.id,
                        JourSemaine = tv.JourSemaine
                        
                    };
                    if (temp.lignetarif==null) temp.lignetarif=new List<LignesTarif>();
                    temp.lignetarif.Add(lignetarifTemp);
                }
                tarifView.Add(temp);
            }


            _tarifView.tarifs = tarifView;
        }
        
        public void WriteChanges(TarifView tarifView)
        {
            switch (tarifView.media)
            {
                case TypeMedia.PR:
                {
                    var temp = new TarifPr()
                    {
                        annee = tarifView.annee,
                        Mois = tarifView.mois,
                        nom = tarifView.Nom,
                        autre = tarifView.Remarque,
                        id = tarifView.id
                    };
                    if (tarifView.lignetarif != null)
                    foreach (var ligne in tarifView.lignetarif)
                    {
                       
                        //TODO : le journée semaine devrait etre une liste d'entier ou liste d'un enum de 1 a 7 

                        switch (ligne.JourSemaine)
                        {
                            case 7 :
                            {
                                for (int i = 0; i < 7; i++)
                                {
                                    var templigne = new LignesTarifPr()
                                    {

                                        id = ligne.id,
                                        Prix = ligne.Prix,

                                    };
                                    FormatPresse formatTemp;
                                    //var reussieParse = FormatPresse.TryParse(ligne.Format, out formatTemp);
                                    templigne.Format = ligne.Format;
                                    templigne.JourSemaine = i;

                                    if(temp.LignesTarifPrs==null)temp.LignesTarifPrs=new List<LignesTarifPr>();
                                    temp.LignesTarifPrs.Add(templigne);
                                }
                                break;
                            }
                            case 8:
                            {
                                for (int i = 0; i < 5; i++)
                                {
                                    var templigne = new LignesTarifPr()
                                    {

                                        id = ligne.id,
                                        Prix = ligne.Prix,

                                    };
                                    FormatPresse formatTemp;
                                    //var reussieParse = FormatPresse.TryParse(ligne.Format, out formatTemp);
                                    templigne.Format = ligne.Format;
                                    templigne.JourSemaine = i;
                                    if (temp.LignesTarifPrs == null) temp.LignesTarifPrs = new List<LignesTarifPr>();
                                    temp.LignesTarifPrs.Add(templigne);
                                }
                                break;
                            }
                                case 9:
                            {
                                for (int i = 5; i < 7; i++)
                                {
                                    var templigne = new LignesTarifPr()
                                    {

                                        id = ligne.id,
                                        Prix = ligne.Prix,

                                    };
                                    FormatPresse formatTemp;
                                    //var reussieParse = FormatPresse.TryParse(ligne.Format, out formatTemp);
                                    templigne.Format = ligne.Format;
                                    templigne.JourSemaine = i;
                                    if (temp.LignesTarifPrs == null) temp.LignesTarifPrs = new List<LignesTarifPr>();
                                    temp.LignesTarifPrs.Add(templigne);
                                }
                                break;
                            }
                            default:
                            {
                                var templigne = new LignesTarifPr()
                                {

                                    id = ligne.id,
                                    Prix = ligne.Prix,

                                };
                                FormatPresse formatTemp;
                                //var reussieParse = FormatPresse.TryParse(ligne.Format, out formatTemp);
                                templigne.Format = ligne.Format;
                                templigne.JourSemaine = ligne.JourSemaine;
                                if (temp.LignesTarifPrs == null) temp.LignesTarifPrs = new List<LignesTarifPr>();
                                temp.LignesTarifPrs.Add(templigne);
                                break;
                            }
                        }

                        

                       

                       
                    }
                    if (temp.LignesTarifPrs == null) temp.LignesTarifPrs = new List<LignesTarifPr>();
                    temp.supportPrs = new List<string>();
                    if(tarifView.SupportsNom!=null)
                            temp.supportPrs.AddRange(tarifView.SupportsNom);
                       

                    _tarifPrRepository.Save(temp);
                    break;
                }




                case TypeMedia.TV:
                {
                    var temp = new TarifTv()
                    {
                        annee = tarifView.annee,
                        Mois = tarifView.mois,
                        nom = tarifView.Nom,
                        autre = tarifView.Remarque,
                        id = tarifView.id
                    };
                    if (tarifView.lignetarif!=null)
                    foreach (var ligne in tarifView.lignetarif)
                    {
                        







                        switch (ligne.JourSemaine)
                        {
                            case 7:
                                {
                                    for (int i = 0; i < 7; i++)
                                    {
                                        var templigne = new LignesTarifTv()
                                        {
                                            JourSemaine = ligne.JourSemaine,
                                            id = ligne.id,
                                            Prix = ligne.Prix,
                                            Debut = ligne.Debut,
                                            Fin = ligne.Fin

                                        };
                                        int tempduree = 0;
                                        //var reussieParse = int.TryParse(ligne.Format, out tempduree);
                                        templigne.duree = ligne.Format;
                                        //TODO : le journée semaine devrait etre une liste d'entier ou liste d'un enum de 1 a 7 
                                        if (temp.LignesTarifTvs == null) temp.LignesTarifTvs = new List<LignesTarifTv>();
                                        templigne.JourSemaine = i;
                                        temp.LignesTarifTvs.Add(templigne);
                                    }
                                    break;
                                }
                            case 8:
                                {
                                    for (int i = 0; i < 5; i++)
                                    {
                                        var templigne = new LignesTarifTv()
                                        {
                                            JourSemaine = ligne.JourSemaine,
                                            id = ligne.id,
                                            Prix = ligne.Prix,
                                            Debut = ligne.Debut,
                                            Fin = ligne.Fin

                                        };
                                        int tempduree = 0;
                                        //var reussieParse = int.TryParse(ligne.Format, out tempduree);
                                        templigne.duree = ligne.Format;
                                        //TODO : le journée semaine devrait etre une liste d'entier ou liste d'un enum de 1 a 7 
                                        if (temp.LignesTarifTvs == null) temp.LignesTarifTvs = new List<LignesTarifTv>();
                                        templigne.JourSemaine = i;
                                        temp.LignesTarifTvs.Add(templigne);
                                    }
                                    break;
                                }
                            case 9:
                                {
                                    for (int i = 5; i < 8; i++)
                                    {
                                        var templigne = new LignesTarifTv()
                                        {
                                            JourSemaine = ligne.JourSemaine,
                                            id = ligne.id,
                                            Prix = ligne.Prix,
                                            Debut = ligne.Debut,
                                            Fin = ligne.Fin

                                        };
                                        int tempduree = 0;
                                        //var reussieParse = int.TryParse(ligne.Format, out tempduree);
                                        templigne.duree = ligne.Format;
                                        //TODO : le journée semaine devrait etre une liste d'entier ou liste d'un enum de 1 a 7 
                                        if (temp.LignesTarifTvs == null) temp.LignesTarifTvs = new List<LignesTarifTv>();
                                        templigne.JourSemaine = i;
                                        temp.LignesTarifTvs.Add(templigne);
                                    }
                                    break;
                                }
                            default:
                                {
                                    var templigne = new LignesTarifTv()
                                    {
                                        JourSemaine = ligne.JourSemaine,
                                        id = ligne.id,
                                        Prix = ligne.Prix,
                                        Debut = ligne.Debut,
                                        Fin = ligne.Fin

                                    };
                                    int tempduree = 0;
                                    //var reussieParse = int.TryParse(ligne.Format, out tempduree);
                                    templigne.duree = ligne.Format;
                                    //TODO : le journée semaine devrait etre une liste d'entier ou liste d'un enum de 1 a 7 
                                    if (temp.LignesTarifTvs == null) temp.LignesTarifTvs = new List<LignesTarifTv>();
                                    templigne.JourSemaine = ligne.JourSemaine;
                                    temp.LignesTarifTvs.Add(templigne);
                                    break;
                                }
                        }

                    }

                    temp.supportTvs=new List<string>();
                    if (tarifView.SupportsNom != null)
                        temp.supportTvs.AddRange(tarifView.SupportsNom);

                    _tarifTvRepository.Save(temp);
                    break;
                }






                case TypeMedia.RD:
                {
                    var temp = new TarifRd()
                    {
                        annee = tarifView.annee,
                        Mois = tarifView.mois,
                        nom = tarifView.Nom,
                        autre = tarifView.Remarque,
                        id = tarifView.id
                    };
                    if (tarifView.lignetarif != null)
                    foreach (var ligne in tarifView.lignetarif)
                    {
                       
                        switch (ligne.JourSemaine)
                        {
                            case 7:
                                {
                                    for (int i = 0; i < 7; i++)
                                    {
                                        var templigne = new LignesTarifRd()
                                        {
                                            JourSemaine = ligne.JourSemaine,
                                            id = ligne.id,
                                            Prix = ligne.Prix,
                                            Debut = ligne.Debut,
                                            Fin = ligne.Fin
                                        };
                                        int tempdure = 0;
                                        //var reussieParse = int.TryParse(ligne.Format, out tempdure );
                                        templigne.duree = ligne.Format;
                                        //TODO : le journée semaine devrait etre une liste d'entier ou liste d'un enum de 1 a 7 
                                        if (temp.LignesTarifRds == null) temp.LignesTarifRds = new List<LignesTarifRd>();
                                        templigne.JourSemaine = i;
                                        temp.LignesTarifRds.Add(templigne);
                                    }
                                    break;
                                }
                            case 8:
                                {
                                    for (int i = 0; i < 5; i++)
                                    {
                                        var templigne = new LignesTarifRd()
                                        {
                                            JourSemaine = ligne.JourSemaine,
                                            id = ligne.id,
                                            Prix = ligne.Prix,
                                            Debut = ligne.Debut,
                                            Fin = ligne.Fin
                                        };
                                        int tempdure = 0;
                                        //var reussieParse = int.TryParse(ligne.Format, out tempdure );
                                        templigne.duree = ligne.Format;
                                        //TODO : le journée semaine devrait etre une liste d'entier ou liste d'un enum de 1 a 7 
                                        if (temp.LignesTarifRds == null) temp.LignesTarifRds = new List<LignesTarifRd>();
                                        templigne.JourSemaine = i;
                                        temp.LignesTarifRds.Add(templigne);
                                    }
                                    break;
                                }
                            case 9:
                                {
                                    for (int i = 5; i < 7; i++)
                                    {
                                        var templigne = new LignesTarifRd()
                                        {JourSemaine = ligne.JourSemaine,
                                            id = ligne.id,
                                            Prix = ligne.Prix,
                                            Debut = ligne.Debut,
                                            Fin = ligne.Fin
                                        };
                                        int tempdure = 0;
                                        //var reussieParse = int.TryParse(ligne.Format, out tempdure );
                                        templigne.duree = ligne.Format;
                                        //TODO : le journée semaine devrait etre une liste d'entier ou liste d'un enum de 1 a 7 
                                        if (temp.LignesTarifRds == null) temp.LignesTarifRds = new List<LignesTarifRd>();
                                        templigne.JourSemaine = i;
                                        temp.LignesTarifRds.Add(templigne);
                                    }
                                    break;
                                }
                            default:
                                {
                                    var templigne = new LignesTarifRd()
                                    {
                                        JourSemaine = ligne.JourSemaine,
                                        id = ligne.id,
                                        Prix = ligne.Prix,
                                        Debut = ligne.Debut,
                                        Fin = ligne.Fin
                                    };
                                    int tempdure = 0;
                                    //var reussieParse = int.TryParse(ligne.Format, out tempdure );
                                    templigne.duree = ligne.Format;
                                    //TODO : le journée semaine devrait etre une liste d'entier ou liste d'un enum de 1 a 7 
                                    if (temp.LignesTarifRds == null) temp.LignesTarifRds = new List<LignesTarifRd>();
                                    templigne.JourSemaine = ligne.JourSemaine;
                                    temp.LignesTarifRds.Add(templigne);
                                    break;
                                }
                        }
                    }
                    temp.supportRds = new List<string>();
                     if(tarifView.SupportsNom!=null)
                            temp.supportRds.AddRange(tarifView.SupportsNom);
                    



                    _tarifRdRepository.Save(temp);
                    break;
                }
            }
            
        }
    }





    public interface ITarifsPresenter
    {
        void Display();
        void WriteChanges(TarifView tarifView);
    }

    public interface ITarifView
    {
        List<TarifView> tarifs { get; set; }
        List<SupportTV> SupportTvs { get; set; }
        List<SupportPresse> SupportPresses { get; set; }
        List<SupportRadio> SupportRadios { get; set; } 

    }



    public class TarifView
    {
        public Guid id { get; set; }
        public string Nom { get; set; }
        public Mois mois { get; set; }
        public int annee { get; set; }
        public string Remarque { get; set; }
        public TypeMedia media { get; set; }
        public List<LignesTarif> lignetarif { get; set; }
        public List<String> SupportsNom { get; set; }
    }

    public class LignesTarif
    {
        public Guid id { get; set; }
        public int Format { get; set; }
        public TimeSpan Debut { get; set; }
        public TimeSpan Fin { get; set; }
        public double Prix { get; set; }
        public int JourSemaine { get; set; }
    }

    public enum TypeMedia
    {
        TV,
        RD,
        PR
    }





    public interface IVagueView
    {
        List<Vague> vagues { get; set; }
    }
    public interface IVaguePresenter
    {
        void Display();
    }

    public class VaguePresenter : IVaguePresenter
    {
        private IVagueView _vagueView;
        private IRepository<Vague, int> _vagueRepository;

        public VaguePresenter(IVagueView vagueView, IRepository<Vague, int> vagueRepository)
        {
            _vagueView = vagueView;
            _vagueRepository = vagueRepository;
        }

        public void Display()
        {
            _vagueView.vagues = _vagueRepository.FindAll().ToList();
        }
    }




}
